iT邦幫忙

2026 iThome 鐵人賽

DAY 20
1

https://ithelp.ithome.com.tw/upload/images/20260908/20178826fSYVhJUGUe.png

過渡效果(Transition)是 CSS 中用來創造流暢動畫的重要功能,能讓元素的狀態變化更加自然平滑。當元素的樣式屬性發生改變時,過渡效果可以讓這個改變不再是瞬間完成,而是在指定的時間內逐漸變化。這種漸進式的視覺變化能大幅提升使用者體驗,讓網頁互動更加生動有趣。

Transition 過渡效果屬性

transition 屬性可用來設定元素在狀態改變時的過渡效果,它可以讓樣式的變化變得平滑自然,而不是突然改變。

/* 基本語法 */
transition: 屬性 過渡持續時間 時間函數 延遲時間;

.button {
  background-color: blue;
  transition: background-color 0.3s ease 0s;
}

.button:hover {
  background-color: red; /* 背景色會在 0.3 秒內平滑變化 */
}

https://ithelp.ithome.com.tw/upload/images/20260908/20178826lIRqRrroFw.png

設定 transition 屬性時,需要將它設定在,要套用過渡效果的屬性選擇器當中。舉例來說,如果需要過渡按鈕的背景顏色,就需要將 transition 寫在設有背景顏色的選擇器當中。而內部其他元素則不會受過渡效果影響。

.button {
  padding: 8px 16px;
  background: #0084ff44;
  /* 過渡設定在 .button */
  transition: 0.3s;
  .text {
	  color: #003b72;
  }
}

.button:hover {
  /* 背景色 #0084ff44 過渡為 #0084ff */
  background: #0084ff;
  .text {
   /* 文字顏色 #003b72 瞬間轉換成 #fff */
	  color: #fff;
  }
}

https://ithelp.ithome.com.tw/upload/images/20260908/201788263THu2hO4TN.png

Transition 完整屬性語法

transition 簡寫屬性實際上包含四個子屬性:

  1. transition-property:指定要套用過渡效果的 CSS 屬性
  2. transition-duration:過渡效果的持續時間
  3. transition-timing-function:過渡效果的時間曲線
  4. transition-delay:過渡效果開始前的延遲時間
.button {
  /* 分開設定各個屬性 */
  transition-property: background-color;
  transition-duration: 0.3s;
  transition-timing-function: ease;
  transition-delay: 0s;

  /* 等同於簡寫 */
  transition: background-color 0.3s ease 0s;
}

Transition 過渡效果的支援性

使用 transition-property 屬性可以指定哪些 CSS 屬性需要套用過渡效果。可以指定單一屬性、多個屬性,或是所有屬性。使用時需注意,並非所有 CSS 屬性都支援過渡效果,某些屬性在改變時會立即完成而無法產生漸變。以下整理出支援與不支援的常見屬性:

支援的屬性

  1. 顏色相關colorbackground-colorborder-coloroutline-color
  2. 尺寸相關widthheightmax-widthmax-heightmin-widthmin-height
  3. 間距相關marginpadding
  4. 位置相關toprightbottomleft
  5. 變形相關transform(包括 translaterotatescale
  6. 透明度opacity
  7. 陰影相關box-shadowtext-shadow
  8. 邊框相關border-widthborder-radius
  9. 文字相關font-sizeletter-spacingline-height

不支援的屬性

  1. display:顯示方式(顯示模式切換無法產生過渡,例如:block 轉化成 none
  2. background-image:背景圖片(圖片無法漸變,通常會使用 opacity 替代)
  3. background:漸層背景(漸層跟背景圖片類似,無法產生過渡效果)
  4. font-family:字體
/* 不支援的範例 */
.no-transition {
  display: block;
  /* 無效,display 改變是瞬間的 */
  transition: display 0.3s;
  &:hover {
    /* 會立即消失,不會有過渡效果 */
    display: none;
  }
}

/* 替代方案:使用 opacity 搭配 visibility */
.fade-transition {
  opacity: 1;
  visibility: visible;
  transition: opacity 0.3s, visibility 0.3s;

  &.hidden {
    opacity: 0;
    visibility: hidden;
  }
}

Transition-duration 過渡持續時間

transition-duration 設定過渡效果的持續時間,決定了動畫從開始到結束需要多長時間。

.element {
  transition-duration: 0.3s;    /* 秒 */
  transition-duration: 300ms;   /* 毫秒 */
  transition-duration: 0s;      /* 無過渡效果 */
}

時間單位

  • 秒(s):1s = 1000ms,適合較長的動畫
  • 毫秒(ms):適合精確控制短時間動畫

使用建議

  • 快速互動(按鈕 hover):0.15s~0.25s
  • 一般過渡效果:0.3s~0.5s
  • 較大幅度的動畫:0.5s~1s
  • 避免使用過長的時間(超過 1s),會讓使用者感到緩慢

Transition-timing-function 過渡時間函數

transition-timing-function 控制過渡效果的動畫速度曲線,決定動畫在不同階段的快慢變化。

.element {
  transition-timing-function: ease;        /* 預設:慢-快-慢 */
  transition-timing-function: linear;      /* 線性:勻速 */
  transition-timing-function: ease-in;     /* 加速:慢-快 */
  transition-timing-function: ease-out;    /* 減速:快-慢 */
  transition-timing-function: ease-in-out; /* 加減速:慢-快-慢 */
  transition-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55);
}

https://ithelp.ithome.com.tw/upload/images/20260908/20178826AXF1oKVF0i.png

時間函數說明

  1. ease(預設):開始和結束時較慢,中間較快,適合大多數情況
  2. linear:全程勻速,適合旋轉、循環動畫
  3. ease-in:開始慢結束快,適合元素消失、縮小
  4. ease-out:開始快結束慢,適合元素出現、放大
  5. ease-in-out:開始和結束都慢,中間快,類似 ease 但更平滑
  6. cubic-bezier(x1, y1, x2, y2):自訂貝茲曲線,能精確控制動畫速度變化

Transition-delay 過渡延遲時間

transition-delay 設定過渡效果開始前的延遲時間,可以用來創造連續動畫效果。

.element {
  transition-delay: 0.5s;    /* 延遲 0.5 秒後開始 */
  transition-delay: 0s;      /* 立即開始(預設)*/
  transition-delay: 200ms;   /* 延遲 200 毫秒 */
}

使用範例

  • 游標移入圖片的放大效果:建立一個容器來放置圖片,並設定變形放大和過渡效果,當滑鼠移入容器時,圖片會平滑地放大。

    <div class="image-box">
    	<img src="images/photo.jpg" class="image">
    </div>
    
    .image-box {
      overflow: hidden; /* 確保放大的圖片不超出容器 */
      border-radius: 8px;
      width: 500px;
      height: 400px;
    	.image {
    	  width: 100%;
    	  height: 100%;
    	  object-fit: cover; /* 確保圖片完全覆蓋容器 */
    	  transition: transform 0.5s ease-out; /* 設定過渡效果 */
    	}
    	/* 滑鼠移入時 .image-box */
    	&:hover .image {
    	  transform: scale(1.2); /* .image 圖片放大 */
    	}
    }
    

    https://ithelp.ithome.com.tw/upload/images/20260908/20178826X3hUJDhDE9.png

  • 表單輸入框效果:表單元素在聚焦時使用過渡效果,可以增強使用者體驗。

    <input type="text" class="input">
    
    .input {
      border: 1px solid #ddd;
      padding: 8px;
      font-size: 16px;
      border-radius: 4px;
      transition: border-color 0.3s, box-shadow 0.3s;
    }
    .input:focus {
      outline: none;
      border-color: #3498db;
      box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.1);
    }
    
    
  • 注意游標觸碰區域:設計 hover 效果時,應避免將會移動的元素作為觸碰區域,否則可能導致元件產生抽動現象。由以下例子說明,當卡片向上移動時,滑鼠可能會離開卡片區域,使卡片回到原位,然後滑鼠又進入卡片區域,造成抖動循環。

    /* 錯誤範例 */
    .card {
      width: 250px;
      height: 400px;
      background: #70cc7c;
      position: relative;
      transition: transform 0.3s;
    }
    /* 當滑鼠移入時 */
    .card:hover {
      transform: translateY(-10px); /* 卡片向上移動 */
    }
    
    
  • 文字氣泡效果:當游標移入按鈕時,會顯示文字氣泡浮出。可以使用透明度來過渡文字氣泡的顯示。以下範例使用偽元素作為文字氣泡,因為偽元素也存在於該元素當中,所以也算是觸碰區。為了避免文字氣泡影響游標互動,可以使用 pointer-events: none; 設定穿透點擊,讓游標不會與文字氣泡互動。

    .button {
      position: relative;
      padding: 12px 20px;
      background: #3498db;
      color: #fff;
      width: fit-content;
      border-radius: 8px;
      cursor: pointer; /* 手指游標 */
    }
    
    .button::before {
      content: '氣泡文字';
      position: absolute;
      bottom: 100%;
      left: 50%;
      width: max-content;
      background: #000000bb;
      border-radius: 8px;
      padding: 8px;
      transform: translate(-50%, 4px);
      transition: 0.3s;
      opacity: 0;
      /* 穿透點擊:確保氣泡不會影響滑鼠事件 */
      pointer-events: none;
    }
    .button:hover {
      background: #1a7bbc;
      &::before{
        opacity: 1;
        transform: translate(-50%, -4px);
      }
    }
    

    https://ithelp.ithome.com.tw/upload/images/20260908/20178826CerrMIurbw.png

使用建議

  1. 保持流暢自然:避免過長的過渡時間(超過 1 秒),大多數過渡效果使用 0.2s~0.4s 的持續時間。
  2. 優先使用高效能屬性:優先使用 transform 和 opacity 操控元素的過渡外觀,避免頻繁改變 width、height、margin 等會觸發頁面重排的屬性。對於複雜動畫,考慮使用 CSS animation 屬性或 JavaScript 來控制。
  3. 測試不同裝置:在多種瀏覽器和裝置上測試動畫效果,確保在行動裝置上有良好的效能表現。請特別注意,觸控裝置沒有 hover 狀態。
  4. 避免位移的互動區域:不要將觸碰後會移動的元素作為 hover 感應區,這會導致抖動現象並降低使用者體驗。

總結

今天介紹了 CSS 的 transition 過渡效果,平常最常使用簡寫形式,一次設定完整的過渡效果:

.element {
  transition: transform 0.3s ease 0s;
}

這一行依序代表「套用的屬性、過渡時間、時間函數與延遲時間」,也就是 transition-propertytransition-durationtransition-timing-functiontransition-delay。當元素的 transform 發生改變時,就會在 0.3 秒內以 ease 的速度曲線平順完成變化。

設定過渡效果時,需要注意並非所有 CSS 屬性都支援漸變,像是 display 就無法直接產生過渡。遇到這類情況時,可以搭配 opacityvisibility,設計出更自然的顯示與隱藏效果。

transition 是製作網頁互動效果的重要基礎,按鈕 hover、圖片放大和輸入框聚焦等效果,都能透過它變得更加流暢。搭配前一天介紹的 transform,就能製作出更多自然的互動動畫!

(ノ>ω<)ノ 第 20 天拉!!!
https://duk.tw/Re5rDz.gif


上一篇
Day 19 - Transform 變形(位移、旋轉、縮放)
下一篇
Day 21 - Animation 動畫效果
系列文
CSS 到底在幹嘛?30 天拯救你被 AI 爆改的網頁排版!22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
RayYuanLiu
iT邦新手 4 級 ‧ 2026-09-08 13:30:56

最下面還有附上動畫,推!

饅頭 iT邦新手 5 級 ‧ 2026-09-08 23:48:02 檢舉

感謝推推!

1
chiaominchang222
iT邦新手 4 級 ‧ 2026-09-08 20:28:31

為什麼顏色可以這麼多種!還那麼有活力

饅頭 iT邦新手 5 級 ‧ 2026-09-08 23:48:19 檢舉

沒錯!活力充沛!

1
AndyAWD
iT邦新手 1 級 ‧ 2026-09-08 23:44:34

居然還有動畫

饅頭 iT邦新手 5 級 ‧ 2026-09-08 23:48:42 檢舉

其實是拿以前畫的來用 www

我要留言

立即登入留言